/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projetolocadora;

import java.sql.*;
import java.util.ArrayList;
import projetolocadora.Cliente;

/**
 *
 * @author Administrador
 */
public class RepositorioCliente extends Conexao {

    private ArrayList<Cliente> lista;
    private static RepositorioCliente instanciaRep;

    
    private RepositorioCliente() {
        this.lista = new ArrayList<Cliente>();
    }

    public static RepositorioCliente obterInstancia() {

        if (instanciaRep == null) {
            instanciaRep = new RepositorioCliente();
        }
        return instanciaRep;
    }

    public int verificaExistencia(Cliente cliente) {
        int retorno = -1;

        for (int i = 0; i < this.lista.size(); i++) {
            if (cliente.getId() == this.lista.get(i).getId()) {
                retorno = i;
                break;
            }
        }

        return 0;
    }

    public void inserir(Cliente cliente) throws Exception {
        if (cliente == null) {
            throw new Exception("O cliente não foi instanciado");
        }
        if (cliente.getNome() == null) {
            throw new Exception("Informe o nome do cliente");
        }
        if (cliente.getNome().trim().equals("")) {
            throw new Exception("Informe o nome do cliente");
        }
        if (cliente.getSobrenome() == null) {
            throw new Exception("Informe o sobrenome do cliente");
        }
        if (cliente.getSobrenome().trim().equals("")) {
            throw new Exception("Informe o sobrenome do cliente");
        }
        if (cliente.getTelefone() == null) {
            throw new Exception("Informe o telefone do cliente");
        }
        if (cliente.getTelefone().trim().equals("")) {
            throw new Exception("Informe o telefone do cliente");
        }
        if (cliente.getRua() == null) {
            throw new Exception("Informe o endereço do cliente");
        }
        if (cliente.getRua().trim().equals("")) {
            throw new Exception("Informe o endereço do cliente");
        }
        if (cliente.getNumero() == 0) {
            throw new Exception("Informe o sobrenome do cliente");
        }
        if (cliente.getBairro() == null) {
            throw new Exception("Informe o bairro do cliente");
        }
        if (cliente.getBairro().trim().equals("")) {
            throw new Exception("Informe o bairro do cliente");
        }
        if (cliente.getCidade() == null) {
            throw new Exception("Informe a cidade do cliente");
        }
        if (cliente.getCidade().trim().equals("")) {
            throw new Exception("Informe a cidade do cliente");
        }
        if (cliente.getBairro() == null) {
            throw new Exception("Informe o bairro do cliente");
        }
        if (cliente.getBairro().trim().equals("")) {
            throw new Exception("Informe o bairro do cliente");
        }
        if (cliente.getCEP() == null) {
            throw new Exception("Informe o CEP do cliente");
        }
        if (cliente.getCEP().trim().equals("")) {
            throw new Exception("Informe o CEP do cliente");
        }
        //abrindo conexao
        Statement conn = conectar();
        String postgresql = "INSERT INTO CLIENTE(NOME, SOBRENOME, TELEFONE, RUA, NUMERO, BAIRRO, CEP, CIDADE, ESTADO)";
        postgresql += "VALUES ('" + cliente.getNome() + "', '" + cliente.getSobrenome() + "', '" + cliente.getTelefone() + "', '" + cliente.getRua()
                + "', '" + cliente.getNumero() + "', '" + cliente.getBairro() + "', '" + cliente.getCEP() + "', '"
                + cliente.getCidade() + "', '" + cliente.getEstado() + "')";

        try {
            conn.execute(postgresql);
        } catch (Exception e) {
            //caso ocorra um erro na conexao, sera levantada essa exceçao
            throw new Exception("Erro ao executar a inserção: " + e.getMessage());
        }
        //fechando a conexao
        desconectar();

    }

    public void atualizar(Cliente cliente) throws Exception {
        if (cliente == null) {
            throw new Exception("O cliente não foi instanciado");
        }
        if (cliente.getNome() == null) {
            throw new Exception("Informe o nome do cliente");
        }
        if (cliente.getNome().trim().equals("")) {
            throw new Exception("Informe o nome do cliente");
        }
        if (cliente.getSobrenome() == null) {
            throw new Exception("Informe o sobrenome do cliente");
        }
        if (cliente.getSobrenome().trim().equals("")) {
            throw new Exception("Informe o sobrenome do cliente");
        }
        if (cliente.getTelefone() == null) {
            throw new Exception("Informe o telefone do cliente");
        }
        if (cliente.getTelefone().trim().equals("")) {
            throw new Exception("Informe o telefone do cliente");
        }
        if (cliente.getRua() == null) {
            throw new Exception("Informe o endereço do cliente");
        }
        if (cliente.getRua().trim().equals("")) {
            throw new Exception("Informe o endereço do cliente");
        }
        if (cliente.getNumero() == 0) {
            throw new Exception("Informe o sobrenome do cliente");
        }
        if (cliente.getBairro() == null) {
            throw new Exception("Informe o bairro do cliente");
        }
        if (cliente.getBairro().trim().equals("")) {
            throw new Exception("Informe o bairro do cliente");
        }
        if (cliente.getCidade() == null) {
            throw new Exception("Informe a cidade do cliente");
        }
        if (cliente.getCidade().trim().equals("")) {
            throw new Exception("Informe a cidade do cliente");
        }
        if (cliente.getBairro() == null) {
            throw new Exception("Informe o bairro do cliente");
        }
        if (cliente.getBairro().trim().equals("")) {
            throw new Exception("Informe o bairro do cliente");
        }
        if (cliente.getCEP() == null) {
            throw new Exception("Informe o CEP do cliente");
        }
        if (cliente.getCEP().trim().equals("")) {
            throw new Exception("Informe o CEP do cliente");
        }
        //abrindo conexao
        Statement conn = conectar();
        String postgresql = "UPDATE CLIENTE SET "
                
                + " NOME = '" + cliente.getNome() + "', " 
                + " SOBRENOME = '" + cliente.getSobrenome() + "', " 
                + " TELEFONE = '" + cliente.getTelefone()+ "', " 
                + " RUA = '" + cliente.getRua() + "', "
                + " NUMERO = '" + cliente.getNumero() + "', "
                + " BAIRRO = '" + cliente.getBairro() + "', " 
                + " CEP = '" + cliente.getCEP() + "', "
                + " CIDADE = '" + cliente.getCidade() + "', " 
                + " ESTADO = '" + cliente.getEstado() + "'"
                + " WHERE ID = " + cliente.getId();

        try {
            conn.execute(postgresql);
        } catch (Exception e) {
            //caso ocorra um erro na conexao, sera levantada essa exceçao
            throw new Exception("Erro ao executar a atualização: " + e.getMessage());
        }
        //fechando a conexao
        desconectar();
    }
    
    public void remover(Cliente cliente) throws Exception {

        //abrindo conexão
        Statement conex = conectar();
        //Instrução Sql remoção produto
        String sql = "DELETE FROM CLIENTE WHERE ID = " + cliente.getId();
        try {
            //Executando instrução sql
            conex.execute(sql);
        } catch (SQLException e) {
            //exceção levantada caso hajá algum erro no metodo
            throw new Exception("erro ao ser executado a remoção: " + e.getMessage());
        }
        //fechando conexão com banco de dados
        desconectar();
    }
    
    public ArrayList<Cliente> listaTodos() throws Exception {
        //abrindo conexão 
        Statement conex = conectar();
        ArrayList<Cliente> retorno = new ArrayList<Cliente>();
        //instrução sql  para seleção dos clientes
        String sql = "SELECT ID, NOME, SOBRENOME, RUA, NUMERO, BAIRRO, CEP, CIDADE, ESTADO, TELEFONE"
                + " FROM CLIENTE ORDER BY NOME";
        try {
            //executando instrução sql
            ResultSet rs = conex.executeQuery(sql);
            while (rs.next()) {
                
                Cliente cliente = new Cliente();
                cliente.setId(rs.getInt("Id"));
                cliente.setNome(rs.getString("Nome"));
                cliente.setSobrenome(rs.getString("Sobrenome"));
                cliente.setRua(rs.getString("Rua"));
                cliente.setNumero(rs.getInt("Numero"));
                cliente.setBairro(rs.getString("Bairro"));
                cliente.setCEP(rs.getString("Cep"));
                cliente.setCidade(rs.getString("Cidade"));
                cliente.setEstado(rs.getString("Estado"));
                cliente.setTelefone(rs.getString("Telefone"));
                
                retorno.add(cliente);
            }
        } catch (Exception e) {
            //caso haja algum erro neste método será levantada esta exceção
            throw new Exception("Erro ao executar consulta: " + e.getMessage());
        }
        //fechando conexão com o banco de dados
        desconectar();
        return retorno;
    }
}
